<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    // 数组扁平化其实就是将一个嵌套多层的数组,嵌套可以是任何的层数
    // 转换为只有一层的数组，把多维的数组拍平，输出最后的一维数组

    // 1.递归实现
    // 通过循环递归的方式，一项项地去遍历，如果每一项还是一个数组，就继续往下遍历
    // 利用递归程序的方法，来实现数组的每一项的连接

    const arr = [1, [2, [3, [4, 5]]]];
    // const flatten = (arr1) => {
    //   let result = [];
    //   for (let i = 0; i < arr1.length; i++) {
    //     //循环遍历的过程中的递归操作
    //     if (Array.isArray(arr1[i])) {
    //       // 把数组的结果通过数组的concat方法拼接到最后要返回的result数组上
    //       result = result.concat(flatten(arr1[i]));
    //     } else {
    //       result.push(arr1[i]);
    //     }
    //   }
    //   return result;
    // };
    // console.log(flatten(arr)); // 最后输出的结果就是扁平化后的数组

    // // 2.reduce函数迭代  reduce返回最后累加的结果
    // const flatten = (arr) => {
    //   return arr.reduce((come, next) => { //reduce 来实现数组的拼接
    //     return come.concat(Array.isArray(next) ? flatten(next) : next);
    //   }, []);
    // };
    // console.log(flatten(arr));

    // 3.扩展运算符
    // 使用扩展运算符和some的方法，两者一起使用
    // const flatten = (arr) => {
    //     // 先用数组some方法把数组中依然是组数项过滤出来
    //   while (arr.some((item) => Array.isArray(item))) {
    //     // 然后执行concat操作，用扩展运算符将其合并
    //     arr = [].concat(...arr);
    //   }
    //   return arr;
    // };
    // console.log(flatten(arr));

    // 4.spit和tostring
    // 数组默认的tostring把数组转换成逗号分隔的字符串，再用split方法转换
    // const flatten = (arr) => {
    //   return arr.toString().split(",");
    // };
    // console.log(flatten(arr));

    // 5.正则
    // 用正则表达式过滤掉字符串中的数组的方括号
    // JSON方法转成字符串转回过程中正则的处理
    const flatten = (arr) => {
      let str = JSON.stringify(arr);
      str = str.replace(/(\[|\])/g, "");
      str = `[${str}]`;
      return JSON.parse(str);
    };
    console.log(flatten(arr));
  </script>
</html>
